home *** CD-ROM | disk | FTP | other *** search
- /*
- * SetFile Linker.c - public interface to SetFile Linker
- *
- * Copyright © 1993 metrowerks inc. All rights reserved.
- *
- */
-
- #define beginC extern "C" {
- #define concludeC }
- /*
- SetFile [option…] file/folder…
- -a attributes # attributes (lowercase = 0, uppercase = 1)*
- -c creator # file creator
- -d date # creation date (mm/dd/yy [hh:mm[:ss] [AM | PM]])*
- -l h,v # ICON location (horizontal,vertical)*
- -m date # modification date (mm/dd/yy [hh:mm[:ss] [AM | PM]])*
- -noResolve # don't resolve aliases on the input file path
- -t type # file type
-
- Note: Period (.) represents the current date and time.
- Note: The following attributes may be used with the -a option:
- A Alias file
- V Invisible*
- B Bundle
- S System (name locked)
- T Stationary
- C Custom icon*
- L Locked
- I Inited*
- N No INIT resources
- M Shared (can run multiple times)
- W Always switch launch (if possible)
- D Desktop*
- *Note: Options/attributes marked with an asterisk (*) are allowed with folders
- */
- /* standard headers */
- #include <stdio.h>
- #include <string.h>
-
- /* system headers */
- #include <Strings.h>
-
- /* compiler headers */
- #include <A4Stuff.h>
- #include <DropInCompilerLinker.h>
- #include <CWPluginErrors.h>
- #include <Files.h>
- #include <Finder.h>
- #include <Errors.h>
- /* project headers */
- #include "SetFilePanel.h"
- #include "EvenMoreFiles.h"
-
-
- /* use standard CodeWarrior debugger */
- #define kDebuggerCreator 'MWDB'
-
- #define kNoChange '????'
- beginC
-
- /* prototypes of local functions */
- CWResult Link (CWPluginContext inContext);
- CWResult Disassemble (CWPluginContext inContext);
- CWResult GetTargetInfo (CWPluginContext inContext);
- CWResult MyGetPreferences (CWPluginContext context, SetFilePref* prefData);
-
-
- /*
- * main - main entry-point for Drop-In SetFile linker
- *
- */
-
- pascal short main (
- CWPluginContext inContext)
- {
- CWResult result;
- long request;
-
- /* set up global world (68K only) */
- EnterCodeResource();
- // DebugStr("\p SetFile main");
-
- if (CWGetPluginRequest (inContext, &request) != noErr) {
- ExitCodeResource ();
- return cwErrRequestFailed;
- }
-
- result = noErr;
-
- /* dispatch on linker request */
- switch (request)
- {
- case reqInitLinker:
- /* linker has just been loaded into memory */
- break;
-
- case reqTermLinker:
- /* linker is about to be unloaded from memory */
- break;
-
- case reqLink:
- /* build the final executable */
- result = Link(inContext);
- break;
-
- case reqTargetInfo:
- /* return info describing target characteristics */
- result = GetTargetInfo(inContext);
- break;
-
- default:
- result = cwErrRequestFailed;
- break;
- }
-
- result = CWDonePluginRequest (inContext, result);
-
- /* tear down global world (68K only) */
- ExitCodeResource();
-
- /* return result code */
- return result;
- }
-
-
- CWResult GetTargetInfo (
- CWPluginContext inContext)
- {
- CWTargetInfo targetInfo;
- SetFilePref prefsData;
- CWResult err;
-
- err = CWGetTargetInfo (inContext, &targetInfo);
-
- if (err != noErr)
- return err;
-
- /* load the relevant prefs */
- err = MyGetPreferences(inContext, &prefsData);
-
- if (err == noErr) {
- /* we can only run applications */
- targetInfo.canRun = (prefsData.type == 'APPL');
-
- } else {
-
- /*
- * Couldn't obtain our prefs. This is possible if the linker is loaded
- * during a project conversion. Just fill in the TargetInfo struct with
- * "innocuous" values.
- */
-
- targetInfo.canRun = false;
- targetInfo.canDebug = false;
- }
-
- err = CWSetTargetInfo (inContext, &targetInfo);
-
- return (err);
- }
-
- CWResult Link (
- CWPluginContext inContext)
- {
- CWTargetInfo targetInfo;
- SetFilePref prefsData;
- CWResult err;
-
- /* load the relevant prefs */
- err = MyGetPreferences (inContext, &prefsData);
- if (err != noErr)
- return (err);
-
- err = CWGetTargetInfo (inContext, &targetInfo);
- if (err != noErr)
- return err;
-
- FInfo fndrInfo;
- ExtendedFileInfo fndrXInfo;
-
- err = FSpGetFInfo(&targetInfo.outfile, &fndrInfo);
- if (err == noErr) {
- FSpRstFLock(&targetInfo.outfile);
- if (kNoChange != prefsData.type)
- fndrInfo.fdType = prefsData.type; /*the type of the file*/
- if (kNoChange != prefsData.creator)
- fndrInfo.fdCreator = prefsData.creator; /*file's creator*/
- fndrInfo.fdFlags = prefsData.flags & validAttrBits; /*flags ex. hasbundle,invisible,locked, etc.*/
-
- err = FSpSetFInfo(&targetInfo.outfile, &fndrInfo);
- }
-
- if (err == noErr) {
- err = FSpGetExtendedFileInfo(&targetInfo.outfile, &fndrXInfo);
- }
-
- if (err == noErr) {
- fndrXInfo.extendedFinderFlags = prefsData.xflags & validAttrXBits;
- err = FSpSetExtendedFileInfo(&targetInfo.outfile, &fndrXInfo);
- }
-
- if (err == noErr) {
- if (prefsData.lock) {
- err = FSpSetFLock (&targetInfo.outfile);
- }
- }
-
- err = CWMacOSErrToCWResult (inContext, err);
-
- return (err);
- }
-
- CWResult MyGetPreferences (
- CWPluginContext context,
- SetFilePref* prefData)
- {
- CWMemHandle prefsHand;
- SetFilePref* prefsPtr;
- CWResult err;
-
- /* load the relevant prefs */
- err = CWGetNamedPreferences (context, kSetFilePanelName, &prefsHand);
- if (err != cwNoErr)
- return (err);
-
- err = CWLockMemHandle (context, prefsHand, false, (void**)&prefsPtr);
- if (err != cwNoErr)
- return (err);
-
- *prefData = *prefsPtr;
- err = CWUnlockMemHandle (context, prefsHand);
-
- return err;
- }
-
- concludeC
-
-
-
-